训练分割器
本指南介绍如何设置和配置 OV80i 的分割功能,以自动检测、测量和分析零件中的特定特征或缺陷。当需要识别不规则形状、测量面积或检测简单分类无法处理的特定模式时,请使用分割功能。
何时使用分割: 表面缺陷、液体溢出、不规则形状、面积测量、图案检测,或任何需要像素级精度的特征。
开始之前
您需要准备
- 已设置并连接的 OV80i 摄像头系统
- 带有待分割特征的测试零件(例如带有铅笔痕迹的板材)
- 适合您应用的良好照明条件
- 15-20 张用于训练的样本图像
步骤 1:创建分割配方
1.1 新建配方
- 导航至“所有配方” 页面
- 点击右上角的
+ New Recipe
- 输入配方名称: 使用描述性名称,如 "Pencil_Mark_Detection" 或 "Surface_Defect_Segmentation"
- 选择配方类型: 从下拉菜单中选择 “Segmentation”
- 点击
OK
创建配方
1.2 激活配方
- 在列表中找到您的配方(显示为“Inactive”)
- 点击
Actions > Activate
- 点击
Activate
确认
✅ 结果: 配方已激活,准备进行配置。
步骤 2:访问配方编辑器
- 点击激活配方旁的
Edit
- 点击
Open Editor
确认
现在您将看到带有分割特定选项的配方编辑器。
步骤 3:配置摄像头设置
3.1 打开成像配置
- 点击左下角的
Configure Imaging
3.2 优化分割对焦
对焦对于准确的边缘检测至关重要:
- 将测试零件放置在摄像头视野中
- 调整对焦,直到边缘清晰锐利
- 用不同零件测试,确保整个产品范围内对焦一致
提示
- 对焦于缺陷/特征所在的表面
- 确保整个感兴趣区域清晰对焦
- 轻微过度锐化优于模糊对焦,利于分割
3.3 设置最佳曝光
适当的曝光确保特征检测一致:
- 调整曝光以获得均衡光照
- 避免过曝区域(纯白区域)
- 确保特征可见且对比度良好
分割曝光指南:
- 特征与背景应有明显对比
- 避免阴影被误判为缺陷
- 用不同零件状态(干净、脏污、磨损)测试
3.4 配置 LED 照明模式
根据分割目标选择照明:
特征类型 | 推荐照明 | 原因 |
---|---|---|
表面缺陷 | 明场照明 | 均匀照明显示表面不规则 |
划痕/裂纹 | 侧光照明 | 产生阴影突出线性缺陷 |
凸起特征 | 暗场照明 | 使凸起区域从背景中突出 |
液体溢出 | 侧光照明 | 显示表面纹理差异 |
3.5 调整伽马以增强特征
- 增加伽马值以增强特征与背景的对比
- 测试不同数值观察目标特征效果
- 找到使特征最易区分的设置
3.6 保存配置
- 在实时预览中检查设置
- 点击
Save Imaging Settings
✅ 检查点: 特征应清晰可见且对比良好。
步骤 4:设置模板和对齐
4.1 导航至模板部分
点击面包屑菜单中的“Template Image and Alignment”
4.2 配置对齐(可选)
本示例跳过对齐:
- 选择
Skip Aligner
(如果零件位置一致) - 点击
Save
何时使用对齐器: 当零件位置或方向变化影响分割准确性时启用。
步骤 5:定义检测区域
5.1 导航至检测设置
点击面包屑菜单中的“Inspection Setup”
5.2 设置感兴趣区域 (ROI)
ROI 定义分割执行的区域:
- 将测试零件放置在摄像头视野中
- 拖动 ROI 角点框选检测区域
- 合理调整 ROI 大小:
- 包含所有可能出现特征的区域
- 排除无关背景
- 在预期特征位置周围留有缓冲区
5.3 分割 ROI 最佳实践
建议 | 避免 |
---|---|
覆盖整个检测表面 | 包含无关背景物体 |
在边缘留缓冲区 | ROI 太小无法覆盖特征变化 |
考虑零件位置变化 | 与夹具或工具重叠 |
用最大预期特征测试 | 包含永久标记区域 |
5.4 保存 ROI 设置
- 确认 ROI 覆盖所有目标区域
- 点击
Save
步骤 6:标注训练数据
6.1 导航至标注与训练
点击面包屑菜单中的“Label And Train”
6.2 配置检测类别
- 点击检测类型下的
Edit
- 重命名类别以匹配特征(如“Pencil Mark”、“Surface Defect”、“Spill Area”)
- 选择类别颜色便于视觉识别
- 保存更改
6.3 捕获并标注训练图像
至少需要 10 张标注图像,推荐 15-20 张:
图像采集流程
- 将第一个测试零件放入检测区域
- 通过摄像头界面拍摄图像
- 使用画笔工具涂抹目标特征
- 准确涂抹:
- 覆盖整个特征区域
- 保持在特征边界内
- 不涂抹背景区域
- 保持标注一致性
- 点击
Save Annotations
- 重复下一零件
标注最佳实践
良好标注 | 不良标注 |
---|---|
精确的特征边界 | 边缘涂抹混乱 |
一致的特征定义 | 标准不一致 |
完整覆盖特征 | 缺失特征区域 |
干净背景(未涂抹) | 误涂背景 |
6.4 训练数据多样性
确保训练集包含:
- 不同大小的特征
- 多种特征强度
- ROI 内多个位置
- 不同照明条件(如适用)
- 边缘案例和临界样本
6.5 训练数据质量检查
- 审查所有标注图像
- 确认标注一致
- 剔除错误标注样本
- 如有需要,添加更多样本
步骤 7:训练分割模型
7.1 开始训练
- 标注完成后点击
Return to Live
- 点击
Train Segmentation Model
7.2 配置训练参数
- 设置迭代次数:
- 快速训练: 50-100 次迭代(5-10 分钟)
- 生产质量: 200-500 次迭代(15-30 分钟)
- 高精度: 500 次以上迭代(30 分钟以上)
- 点击
Start Training
7.3 监控训练进度
训练进度显示:
- 当前迭代次数
- 训练准确率百分比
- 预计完成时间
训练控制:
- Abort Training: 出现问题时停止训练
- Finish Training Early: 达到满意准确率时提前结束
提示
- 85% 准确率通常适合生产
- 训练会在达到目标准确率时自动停止
- 增加训练数据通常比增加迭代次数更有效
步骤 8:测试分割性能
8.1 访问实时预览
- 训练完成后点击
Live Preview
- 使用各种零件测试:
- 已知良品(应显示无或极少分割)
- 已知缺陷品(应突出缺陷)
- 边缘案例和临界样本
8.2 评估结果
检查分割质量:
指标 | 良好表现 | 需改进 |
---|---|---|
准确率 | 稳定检测真实特征 | 漏检明显特征 |
精确度 | 误报少 | 误将背景标为缺陷 |
边缘质量 | 边界清晰准确 | 边缘粗糙不准确 |
一致性 | 重复测试结果相似 | 结果波动大 |
8.3 低质量结果排查
问题 | 可能原因 | 解决方案 |
---|---|---|
漏检特征 | 训练数据不足 | 增加标注样本 |
误报多 | 照明/对比度差 | 优化成像设置 |
边缘粗糙 | 图像质量差 | 改善对焦/照明 |
结果不稳定 | 训练样本多样性不足 | 增加多样样本 |
步骤 9:配置合格/不合格逻辑
9.1 访问 IO 模块
- 确保 AI 模型显示绿色(已训练状态)
- 通过面包屑菜单导航至 IO Block
9.2 删除默认逻辑
- 删除 Classification Block Logic 节点
- 准备构建自定义分割逻辑
9.3 构建分割流程
在 Node-RED 中创建以下节点流程:
- 从左侧面板拖拽节点:
- Function 节点(用于逻辑)
- Debug 节点(用于测试)
- 最终 Pass/Fail 节点
- 用连线连接节点
9.4 根据需求配置逻辑
选项 A:无缺陷即合格
应用场景: 任何检测到特征即判不合格的质量检测
Function 节点代码:
const allBlobs = msg.payload.segmentation.blobs;
const results = allBlobs.length < 1; // 无特征则合格
msg.payload = results;
return msg;
选项 B:仅小缺陷合格
应用场景: 接受小于阈值的轻微缺陷
Function 节点代码:
const threshold = 500; // 调整像素计数阈值
const allBlobs = msg.payload.segmentation.blobs;
const allUnderThreshold = allBlobs.every(blob => blob.pixel_count < threshold);
msg.payload = allUnderThreshold;
return msg;
选项 C:总缺陷面积小即合格
应用场景: 接受总缺陷面积有限的零件
Function 节点代码:
const threshold = 5000; // 调整总像素阈值
const allBlobs = msg.payload.segmentation.blobs;
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_count, 0);
msg.payload = totalArea < threshold;
return msg;
9.5 配置 Function 节点
- 双击 Function 节点
- 复制上述相应代码
- 粘贴到“On Message”标签页
- 根据应用调整阈值
- 点击
Done
9.6 部署并测试逻辑
- 点击
Deploy
激活逻辑 - 导航至 HMI 进行测试
- 使用已知良品和不良品测试
- 确认合格/不合格结果符合预期
步骤 10:生产验证
10.1 全面测试
使用以下测试用例验证分割系统:
测试用例 | 预期结果 | 失败时操作 |
---|---|---|
干净零件 | 合格(无分割) | 调整阈值或重新训练 |
轻微缺陷 | 根据标准合格/不合格 | 优化逻辑参数 |
严重缺陷 | 不合格(明显分割) | 检查模型准确性 |
边缘案例 | 结果一致 | 增加训练数据 |
10.2 性能验证
监控以下指标:
- 每次检测处理时间
- 多次测试结果一致性
- 生产环境照明下的准确率
- 长时间运行的可靠性
10.3 最终调整
若性能不理想:
- 增加边缘案例训练数据
- 调整逻辑中的阈值
- 改善成像条件
- 增加迭代次数重新训练模型
成功!您的分割系统已准备就绪
您现在拥有一个可:
- 自动检测 特定特征或缺陷
- 以像素级精度测量面积
- 根据需求应用自定义合格/不合格逻辑
- 通过 I/O 控制与生产系统集成
高级配置选项
自定义阈值逻辑
针对复杂验收标准,可组合多条件:
const smallThreshold = 200;
const largeThreshold = 1000;
const maxTotalArea = 3000;
const allBlobs = msg.payload.segmentation.blobs;
const smallBlobs = allBlobs.filter(blob => blob.pixel_count < smallThreshold);
const largeBlobs = allBlobs.filter(blob => blob.pixel_count > largeThreshold);
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_c